//
//  CQEmoticon.swift
//  表情键盘的搭建
//
//  Created by 陈乾 on 15/11/5.
//  Copyright © 2015年 陈乾. All rights reserved.
//   表情包模型 和表情模型

import UIKit

class CQEmoticonPackage: NSObject {
    
    //获取路径
   static let bundlePath = NSBundle.mainBundle().pathForResource("Emoticons.bundle", ofType: nil)
    

    
    //MARK: - 文件夹的名称
    var id: String?
    //MARK: - 表情包名称
    var group_name_cn: String?
    
    //MARK: - 表情 数组
    var emoticons: [CQEmoticon]?
    
    //MARK: - 构造函数
    init(id: String) {
         self.id = id
        super.init()
    }
    
    //不要每次去加载 值加载一次 到内存
    static let emoticonPackageArr = CQEmoticonPackage.loadEmoticonPackage()
    ///加载表情包
    class func loadEmoticonPackage() -> [CQEmoticonPackage] {
    
               //拼接路径 获取全路径
        let plistPath = bundlePath! + "/emoticons.plist"
        
        //加载plist
      let plistDict = NSDictionary(contentsOfFile: plistPath)!
        
        //创建表情包数组
        var emoticonPackageArr = [CQEmoticonPackage]()
        
        //创建 最近 的表情包
       
        let currentEmoticon = CQEmoticonPackage(id: "")
        //设置名字
        currentEmoticon.group_name_cn = "最近"
        //给表情包里的数组属性 初始化
        currentEmoticon.emoticons = [CQEmoticon]()
        //最近 的表情包添加空表情
        currentEmoticon.addEmptyEmoticon()
        //把最近 的表情包添加到表情包数组
        emoticonPackageArr.append(currentEmoticon)
        
        
        
        
        //获取id
        if let packageArr = plistDict["packages"] as? [[String: AnyObject]] {
       
          //遍历数组 获得字典
            for dic in packageArr {
            
               let id = dic["id"] as? String
               print("id:\(id)")
                //创建表情包
               let emoticonPckage = CQEmoticonPackage(id: id!)
               //把表情包装到数组
                emoticonPackageArr.append(emoticonPckage)
                ///- 进一步加载表情包的名字和
                emoticonPckage.loadEmoticonOtherInfo(id)
                
            }
     
        }
        
     return emoticonPackageArr
    }
    
    //MARK: - 进一步加载表情包的名字和
    
    func loadEmoticonOtherInfo(id: String?) {
     
        // bundle + id + info.plist
        let infoPath = CQEmoticonPackage.bundlePath! + "/" + id! + "/info.plist"
      
        //获得group_name_cn
        let infoDict = NSDictionary(contentsOfFile: infoPath)!
        group_name_cn = infoDict["group_name_cn"] as? String
        
        //创建表情数组
        emoticons = [CQEmoticon]()
        
        //记录每一组的最后一个表情 把最后的表情变成删除按钮
        var index = 0
        
        //获取emoticons数组 里面装了 CQEmoticon模型数据
        if let array = infoDict["emoticons"] as? [[String: String]] {
            for dic in array {
              //保存到
            emoticons?.append(CQEmoticon(id: id!, dic: dic))
               index++
                //如果是最后一个表情 就设置删除
                if index == 20 {
                 emoticons?.append(CQEmoticon(removeEmoticon: true))
                    index = 0
                }
                
            }
        }
        //添加空白表情
        addEmptyEmoticon()
        
        
    }
    //MARK: - 添加空白表情
    ///添加空白表情
    func addEmptyEmoticon() {
       
        let count = emoticons!.count % 21
        
        //不够21个的表情页在后面添加空表情
        //默认页 添加空表情
        if count > 0 || emoticons!.count == 0 {
        
            for _ in count..<20 {
             emoticons?.append(CQEmoticon(removeEmoticon: false))
            }
        
            //添加删除
            emoticons?.append(CQEmoticon(removeEmoticon: true))
        }
    
    }
    
    //MARK: - 添加最近按钮的表情模型
   class func addFavoriteEmoticon(emoticon:CQEmoticon) {
        
        //如果是删除按钮就不添加
        if emoticon.removeEmoticon {
        return
        }
        
        //使用次数加1
        emoticon.times++
        // 获取到最近表情包里面的表情数组
        var currentEmoticon = emoticonPackageArr[0].emoticons
        
        //移除删除按
        let removeButton = currentEmoticon?.removeLast()
        
         let contains = currentEmoticon!.contains(emoticon)
         //如果不存在 就添加
          if  !contains {
            //把传进来的表情模型拼接其后面
            currentEmoticon!.append(emoticon)
        }
        //降序排序
        currentEmoticon = currentEmoticon!.sort({ (e1, e2) -> Bool in
            
            return e1.times > e2.times
        })
        
        //不存在 删除最后一个 保证最多21个
        if !contains {
           currentEmoticon?.removeLast()
        }
        //添加删除按钮
         currentEmoticon?.append(removeButton!)
        //重新赋值回去
        emoticonPackageArr[0].emoticons = currentEmoticon

        
    }
    
    
    
    
    
/*end*/
}


class CQEmoticon: NSObject {

    ///记录表情使用次数的标记
    var times = 0
    ///文件夹路径
    var id: String?
    ///用于网络传输的图片
    var chs: String?
    ///图片的名称
    var png: String? {
        didSet{
        pngPath = CQEmoticonPackage.bundlePath! + "/" + id! + "/" + png!
            
        }
    }
    
    
    ///表情图片的完整路径
    var pngPath: String?
    
    ///十六进制的emoji
    var code: String? {
      //当给code赋值的时候 我们就转成能够用来使用的emoji字符串
        didSet{
            
            guard let co = code else {
                // 表示code没值
                return
            }
            
            // 将code转成emoji表情
            let scanner = NSScanner(string: co)
            
            // 存储扫描结果
            // UnsafeMutablePointer<UInt32>: UInt32类型的可变指针
            var value: UInt32 = 0
            
            scanner.scanHexInt(&value)
            
            let c = Character(UnicodeScalar(value))
            
            emoji = String(c)
        }
    }
    
    ///emoji图片
    var emoji: String?
    
    /// ture代表删除按钮的 false代表空的模型
    var removeEmoticon: Bool = false
    
    
    ///再写一个构造方法 用这个构造方法创建的 不是空模型就是删除按钮的模型
    init(removeEmoticon: Bool) {
     self.removeEmoticon = removeEmoticon
     super.init()
    }
    
    
    
   
    
    
    
    
    
    
    //字典转模型
    init(id: String, dic: [String: String]) {
       super.init()
        self.id = id
     setValuesForKeysWithDictionary(dic)
    }
    //字典的key没有对应的属性
    override func setValue(value: AnyObject?, forUndefinedKey key: String) {
    }
    
    //模型打印方法
   override var description: String {
    
        let p = ["id", "png", "code"]
    
      return "\n\t:\(dictionaryWithValuesForKeys(p))"
    }
    
    
}
